home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / asm-generic / siginfo.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  8KB  |  292 lines

  1. #ifndef _ASM_GENERIC_SIGINFO_H
  2. #define _ASM_GENERIC_SIGINFO_H
  3.  
  4. #include <linux/compiler.h>
  5. #include <linux/types.h>
  6. #include <linux/resource.h>
  7.  
  8. #ifndef _SIGNAL_H
  9. typedef union sigval {
  10.     int sival_int;
  11.     void __user *sival_ptr;
  12. } sigval_t;
  13. #endif
  14.  
  15. /*
  16.  * This is the size (including padding) of the part of the
  17.  * struct siginfo that is before the union.
  18.  */
  19. #ifndef __ARCH_SI_PREAMBLE_SIZE
  20. #define __ARCH_SI_PREAMBLE_SIZE    (3 * sizeof(int))
  21. #endif
  22.  
  23. #define SI_MAX_SIZE    128
  24. #ifndef SI_PAD_SIZE
  25. #define SI_PAD_SIZE    ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
  26. #endif
  27.  
  28. #ifndef __ARCH_SI_UID_T
  29. #define __ARCH_SI_UID_T    uid_t
  30. #endif
  31.  
  32. /*
  33.  * The default "si_band" type is "long", as specified by POSIX.
  34.  * However, some architectures want to override this to "int"
  35.  * for historical compatibility reasons, so we allow that.
  36.  */
  37. #ifndef __ARCH_SI_BAND_T
  38. #define __ARCH_SI_BAND_T long
  39. #endif
  40.  
  41. #ifndef HAVE_ARCH_SIGINFO_T
  42. #ifndef _SIGNAL_H
  43. typedef struct siginfo {
  44.     int si_signo;
  45.     int si_errno;
  46.     int si_code;
  47.  
  48.     union {
  49.         int _pad[SI_PAD_SIZE];
  50.  
  51.         /* kill() */
  52.         struct {
  53.             pid_t _pid;        /* sender's pid */
  54.             __ARCH_SI_UID_T _uid;    /* sender's uid */
  55.         } _kill;
  56.  
  57.         /* POSIX.1b timers */
  58.         struct {
  59.             timer_t _tid;        /* timer id */
  60.             int _overrun;        /* overrun count */
  61.             char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
  62.             sigval_t _sigval;    /* same as below */
  63.             int _sys_private;       /* not to be passed to user */
  64.         } _timer;
  65.  
  66.         /* POSIX.1b signals */
  67.         struct {
  68.             pid_t _pid;        /* sender's pid */
  69.             __ARCH_SI_UID_T _uid;    /* sender's uid */
  70.             sigval_t _sigval;
  71.         } _rt;
  72.  
  73.         /* SIGCHLD */
  74.         struct {
  75.             pid_t _pid;        /* which child */
  76.             __ARCH_SI_UID_T _uid;    /* sender's uid */
  77.             int _status;        /* exit code */
  78.             clock_t _utime;
  79.             clock_t _stime;
  80.         } _sigchld;
  81.  
  82.         /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
  83.         struct {
  84.             void __user *_addr; /* faulting insn/memory ref. */
  85. #ifdef __ARCH_SI_TRAPNO
  86.             int _trapno;    /* TRAP # which caused the signal */
  87. #endif
  88.         } _sigfault;
  89.  
  90.         /* SIGPOLL */
  91.         struct {
  92.             __ARCH_SI_BAND_T _band;    /* POLL_IN, POLL_OUT, POLL_MSG */
  93.             int _fd;
  94.         } _sigpoll;
  95.     } _sifields;
  96. } siginfo_t;
  97. #endif
  98. #endif
  99.  
  100. /*
  101.  * How these fields are to be accessed.
  102.  */
  103. #define si_pid        _sifields._kill._pid
  104. #define si_uid        _sifields._kill._uid
  105. #define si_tid        _sifields._timer._tid
  106. #define si_overrun    _sifields._timer._overrun
  107. #define si_sys_private  _sifields._timer._sys_private
  108. #define si_status    _sifields._sigchld._status
  109. #define si_utime    _sifields._sigchld._utime
  110. #define si_stime    _sifields._sigchld._stime
  111. #define si_value    _sifields._rt._sigval
  112. #define si_int        _sifields._rt._sigval.sival_int
  113. #define si_ptr        _sifields._rt._sigval.sival_ptr
  114. #define si_addr        _sifields._sigfault._addr
  115. #ifdef __ARCH_SI_TRAPNO
  116. #define si_trapno    _sifields._sigfault._trapno
  117. #endif
  118. #define si_band        _sifields._sigpoll._band
  119. #define si_fd        _sifields._sigpoll._fd
  120.  
  121. #ifdef __KERNEL__
  122. #define __SI_MASK    0xffff0000u
  123. #define __SI_KILL    (0 << 16)
  124. #define __SI_TIMER    (1 << 16)
  125. #define __SI_POLL    (2 << 16)
  126. #define __SI_FAULT    (3 << 16)
  127. #define __SI_CHLD    (4 << 16)
  128. #define __SI_RT        (5 << 16)
  129. #define __SI_MESGQ    (6 << 16)
  130. #define __SI_CODE(T,N)    ((T) | ((N) & 0xffff))
  131. #else
  132. #define __SI_KILL    0
  133. #define __SI_TIMER    0
  134. #define __SI_POLL    0
  135. #define __SI_FAULT    0
  136. #define __SI_CHLD    0
  137. #define __SI_RT        0
  138. #define __SI_MESGQ    0
  139. #define __SI_CODE(T,N)    (N)
  140. #endif
  141.  
  142. /*
  143.  * si_code values
  144.  * Digital reserves positive values for kernel-generated signals.
  145.  */
  146. #define SI_USER        0        /* sent by kill, sigsend, raise */
  147. #define SI_KERNEL    0x80        /* sent by the kernel from somewhere */
  148. #define SI_QUEUE    -1        /* sent by sigqueue */
  149. #define SI_TIMER __SI_CODE(__SI_TIMER,-2) /* sent by timer expiration */
  150. #define SI_MESGQ __SI_CODE(__SI_MESGQ,-3) /* sent by real time mesq state change */
  151. #define SI_ASYNCIO    -4        /* sent by AIO completion */
  152. #define SI_SIGIO    -5        /* sent by queued SIGIO */
  153. #define SI_TKILL    -6        /* sent by tkill system call */
  154. #define SI_DETHREAD    -7        /* sent by execve() killing subsidiary threads */
  155.  
  156. #define SI_FROMUSER(siptr)    ((siptr)->si_code <= 0)
  157. #define SI_FROMKERNEL(siptr)    ((siptr)->si_code > 0)
  158.  
  159. /*
  160.  * SIGILL si_codes
  161.  */
  162. #define ILL_ILLOPC    (__SI_FAULT|1)    /* illegal opcode */
  163. #define ILL_ILLOPN    (__SI_FAULT|2)    /* illegal operand */
  164. #define ILL_ILLADR    (__SI_FAULT|3)    /* illegal addressing mode */
  165. #define ILL_ILLTRP    (__SI_FAULT|4)    /* illegal trap */
  166. #define ILL_PRVOPC    (__SI_FAULT|5)    /* privileged opcode */
  167. #define ILL_PRVREG    (__SI_FAULT|6)    /* privileged register */
  168. #define ILL_COPROC    (__SI_FAULT|7)    /* coprocessor error */
  169. #define ILL_BADSTK    (__SI_FAULT|8)    /* internal stack error */
  170. #define NSIGILL        8
  171.  
  172. /*
  173.  * SIGFPE si_codes
  174.  */
  175. #define FPE_INTDIV    (__SI_FAULT|1)    /* integer divide by zero */
  176. #define FPE_INTOVF    (__SI_FAULT|2)    /* integer overflow */
  177. #define FPE_FLTDIV    (__SI_FAULT|3)    /* floating point divide by zero */
  178. #define FPE_FLTOVF    (__SI_FAULT|4)    /* floating point overflow */
  179. #define FPE_FLTUND    (__SI_FAULT|5)    /* floating point underflow */
  180. #define FPE_FLTRES    (__SI_FAULT|6)    /* floating point inexact result */
  181. #define FPE_FLTINV    (__SI_FAULT|7)    /* floating point invalid operation */
  182. #define FPE_FLTSUB    (__SI_FAULT|8)    /* subscript out of range */
  183. #define NSIGFPE        8
  184.  
  185. /*
  186.  * SIGSEGV si_codes
  187.  */
  188. #define SEGV_MAPERR    (__SI_FAULT|1)    /* address not mapped to object */
  189. #define SEGV_ACCERR    (__SI_FAULT|2)    /* invalid permissions for mapped object */
  190. #define NSIGSEGV    2
  191.  
  192. /*
  193.  * SIGBUS si_codes
  194.  */
  195. #define BUS_ADRALN    (__SI_FAULT|1)    /* invalid address alignment */
  196. #define BUS_ADRERR    (__SI_FAULT|2)    /* non-existant physical address */
  197. #define BUS_OBJERR    (__SI_FAULT|3)    /* object specific hardware error */
  198. #define NSIGBUS        3
  199.  
  200. /*
  201.  * SIGTRAP si_codes
  202.  */
  203. #define TRAP_BRKPT    (__SI_FAULT|1)    /* process breakpoint */
  204. #define TRAP_TRACE    (__SI_FAULT|2)    /* process trace trap */
  205. #define NSIGTRAP    2
  206.  
  207. /*
  208.  * SIGCHLD si_codes
  209.  */
  210. #define CLD_EXITED    (__SI_CHLD|1)    /* child has exited */
  211. #define CLD_KILLED    (__SI_CHLD|2)    /* child was killed */
  212. #define CLD_DUMPED    (__SI_CHLD|3)    /* child terminated abnormally */
  213. #define CLD_TRAPPED    (__SI_CHLD|4)    /* traced child has trapped */
  214. #define CLD_STOPPED    (__SI_CHLD|5)    /* child has stopped */
  215. #define CLD_CONTINUED    (__SI_CHLD|6)    /* stopped child has continued */
  216. #define NSIGCHLD    6
  217.  
  218. /*
  219.  * SIGPOLL si_codes
  220.  */
  221. #define POLL_IN        (__SI_POLL|1)    /* data input available */
  222. #define POLL_OUT    (__SI_POLL|2)    /* output buffers available */
  223. #define POLL_MSG    (__SI_POLL|3)    /* input message available */
  224. #define POLL_ERR    (__SI_POLL|4)    /* i/o error */
  225. #define POLL_PRI    (__SI_POLL|5)    /* high priority input available */
  226. #define POLL_HUP    (__SI_POLL|6)    /* device disconnected */
  227. #define NSIGPOLL    6
  228.  
  229. /*
  230.  * sigevent definitions
  231.  * 
  232.  * It seems likely that SIGEV_THREAD will have to be handled from 
  233.  * userspace, libpthread transmuting it to SIGEV_SIGNAL, which the
  234.  * thread manager then catches and does the appropriate nonsense.
  235.  * However, everything is written out here so as to not get lost.
  236.  */
  237. #define SIGEV_SIGNAL    0    /* notify via signal */
  238. #define SIGEV_NONE    1    /* other notification: meaningless */
  239. #define SIGEV_THREAD    2    /* deliver via thread creation */
  240. #define SIGEV_THREAD_ID 4    /* deliver to thread */
  241.  
  242. #define SIGEV_MAX_SIZE    64
  243. #ifndef SIGEV_PAD_SIZE
  244. #define SIGEV_PAD_SIZE    ((SIGEV_MAX_SIZE/sizeof(int)) - 3)
  245. #endif
  246.  
  247. #ifndef _SIGNAL_H
  248. typedef struct sigevent {
  249.     sigval_t sigev_value;
  250.     int sigev_signo;
  251.     int sigev_notify;
  252.     union {
  253.         int _pad[SIGEV_PAD_SIZE];
  254.          int _tid;
  255.  
  256.         struct {
  257.             void (*_function)(sigval_t);
  258.             void *_attribute;    /* really pthread_attr_t */
  259.         } _sigev_thread;
  260.     } _sigev_un;
  261. } sigevent_t;
  262. #endif
  263. #define sigev_notify_function    _sigev_un._sigev_thread._function
  264. #define sigev_notify_attributes    _sigev_un._sigev_thread._attribute
  265. #define sigev_notify_thread_id     _sigev_un._tid
  266.  
  267. #ifdef __KERNEL__
  268.  
  269. struct siginfo;
  270. void do_schedule_next_timer(struct siginfo *info);
  271.  
  272. #ifndef HAVE_ARCH_COPY_SIGINFO
  273.  
  274. #include <linux/string.h>
  275.  
  276. static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
  277. {
  278.     if (from->si_code < 0)
  279.         memcpy(to, from, sizeof(*to));
  280.     else
  281.         /* _sigchld is currently the largest know union member */
  282.         memcpy(to, from, __ARCH_SI_PREAMBLE_SIZE + sizeof(from->_sifields._sigchld));
  283. }
  284.  
  285. #endif
  286.  
  287. extern int copy_siginfo_to_user(struct siginfo __user *to, struct siginfo *from);
  288.  
  289. #endif /* __KERNEL__ */
  290.  
  291. #endif
  292.